home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 10 / AACD 10.iso / AACD / Games / MAME / src / sound / dac.c < prev    next >
C/C++ Source or Header  |  2000-04-04  |  2KB  |  132 lines

  1. #include "driver.h"
  2. #include <math.h>
  3.  
  4.  
  5. static int channel[MAX_DAC];
  6. static int output[MAX_DAC];
  7. static int UnsignedVolTable[256];
  8. static int SignedVolTable[256];
  9.  
  10.  
  11.  
  12. static void DAC_update(int num,INT16 *buffer,int length)
  13. {
  14.     int out = output[num];
  15.  
  16.     while (length--) *(buffer++) = out;
  17. }
  18.  
  19.  
  20. void DAC_data_w(int num,int data)
  21. {
  22.     int out = UnsignedVolTable[data];
  23.  
  24.     if (output[num] != out)
  25.     {
  26.         /* update the output buffer before changing the registers */
  27.         stream_update(channel[num],0);
  28.         output[num] = out;
  29.     }
  30. }
  31.  
  32.  
  33. void DAC_signed_data_w(int num,int data)
  34. {
  35.     int out = SignedVolTable[data];
  36.  
  37.     if (output[num] != out)
  38.     {
  39.         /* update the output buffer before changing the registers */
  40.         stream_update(channel[num],0);
  41.         output[num] = out;
  42.     }
  43. }
  44.  
  45.  
  46. void DAC_data_16_w(int num,int data)
  47. {
  48.     int out = data >> 1;        /* range      0..32767 */
  49.  
  50.     if (output[num] != out)
  51.     {
  52.         /* update the output buffer before changing the registers */
  53.         stream_update(channel[num],0);
  54.         output[num] = out;
  55.     }
  56. }
  57.  
  58.  
  59. void DAC_signed_data_16_w(int num,int data)
  60. {
  61.     int out = data - 0x8000;    /* range -32768..32767 */
  62.  
  63.     if (output[num] != out)
  64.     {
  65.         /* update the output buffer before changing the registers */
  66.         stream_update(channel[num],0);
  67.         output[num] = out;
  68.     }
  69. }
  70.  
  71.  
  72. static void DAC_build_voltable(void)
  73. {
  74.     int i;
  75.  
  76.  
  77.     /* build volume table (linear) */
  78.     for (i = 0;i < 256;i++)
  79.     {
  80.         UnsignedVolTable[i] = i * 0x101 / 2;    /* range      0..32767 */
  81.         SignedVolTable[i] = i * 0x101 - 0x8000;    /* range -32768..32767 */
  82.     }
  83. }
  84.  
  85.  
  86. int DAC_sh_start(const struct MachineSound *msound)
  87. {
  88.     int i;
  89.     const struct DACinterface *intf = msound->sound_interface;
  90.  
  91.  
  92.     DAC_build_voltable();
  93.  
  94.     for (i = 0;i < intf->num;i++)
  95.     {
  96.         char name[40];
  97.  
  98.  
  99.         sprintf(name,"DAC #%d",i);
  100.         channel[i] = stream_init(name,intf->mixing_level[i],Machine->sample_rate,
  101.                 i,DAC_update);
  102.  
  103.         if (channel[i] == -1)
  104.             return 1;
  105.  
  106.         output[i] = 0;
  107.     }
  108.  
  109.     return 0;
  110. }
  111.  
  112.  
  113. WRITE_HANDLER( DAC_0_data_w )
  114. {
  115.     DAC_data_w(0,data);
  116. }
  117.  
  118. WRITE_HANDLER( DAC_1_data_w )
  119. {
  120.     DAC_data_w(1,data);
  121. }
  122.  
  123. WRITE_HANDLER( DAC_0_signed_data_w )
  124. {
  125.     DAC_signed_data_w(0,data);
  126. }
  127.  
  128. WRITE_HANDLER( DAC_1_signed_data_w )
  129. {
  130.     DAC_signed_data_w(1,data);
  131. }
  132.